<?php
/**
 * Created by PhpStorm.
 * User: aron
 * Date: 2019/5/5
 * Time: 8:43 PM
 */

$foo = 25;
$bar = &$foo;
echo "bar = " . $bar . " foo = " . $foo . "\r\n";

unset($bar);
echo "after unset bar => bar = " . $bar . " foo = " . $foo . "\r\n";

// 变量的类型包含了：
// - 四种标量类型
//      - bool 布尔
//      - integer 整数
//      - float/double 浮点数
//      - string 字符串
// - 两种复合类型
//      - array 数组
//      - object 对象
// - 两种特殊类型
//      - resource 资源
//      - NULL
// 变量的类型，由上下文决定的，不能置顶类型，PHP会进行自动推导

// - 四种标量类型
//      - bool 布尔
//      - integer 整数
//      - float/double 浮点数
//      - string 字符串
{
    echo "<br>\r\n";
    $bool = TRUE;
    var_dump($bool);

    $str = "hello";
    var_dump($str);

    $int = 123;
    var_dump($int);

    $float = 123.123;
    var_dump($float);
}

// 字符串
{
    echo "<br>\r\n";
    // 普通的字符串赋值
    $string = "hello world";
    // 大段文字使用定界符
    $string = <<<EOF
永和九年，岁在癸丑，暮春之初，会于会稽山阴之兰亭，修禊事也。群贤毕至，少长咸集。此地有崇山峻岭，茂林修竹，又有清流激湍，映带左右，引以为流觞曲水，列坐其次。虽无丝竹管弦之盛，一觞一咏，亦足以畅叙幽情。
是日也，天朗气清，惠风和畅。仰观宇宙之大，俯察品类之盛，所以游目骋怀，足以极视听之娱，信可乐也。
夫人之相与，俯仰一世。或取诸怀抱，悟言一室之内；或因寄所托，放浪形骸之外。虽趣舍万殊，静躁不同，当其欣于所遇，暂得于己，快然自足，不知老之将至；及其所之既倦，情随事迁，感慨系之矣。向之所欣，俯仰之间，已为陈迹，犹不能不以之兴怀，况修短随化，终期于尽！古人云：“死生亦大矣。”岂不痛哉！
每览昔人兴感之由，若合一契，未尝不临文嗟悼，不能喻之于怀。固知一死生为虚诞，齐彭殇为妄作。后之视今，亦犹今之视昔，悲夫！故列叙时人，录其所述，虽世殊事异，所以兴怀，其致一也。后之览者，亦将有感于斯文。
EOF;
echo $string;
}

// - 两种复合类型
//      - array 数组
//      - object 对象
// 数组类型
{
    echo "<br>\r\n";
    // 关联数组
    $userInfo = array("age" => 34, "name" => "xiaomin");
    var_dump($userInfo);
    print_r($userInfo);
    echo "age = " . $userInfo["age"];
    echo "name = " . $userInfo["name"];

    // 下标数组
    echo "<br>\r\n";
    $chars = array("A", "B", "C");
    print_r($chars);
}


// 对象类型
{
    class Person {
        var $name;

        function sayHello() {
            echo $this->name . " say hello";
        }
    }


    echo "<br>\r\n";
    $person = new Person();
    $person->name = "xiaomin";
    $person->sayHello();
}

// - 两种特殊类型
//      - resource 资源
//      - NULL
// resource 资源类型
{
    // resource类型为3的文件类型
    echo "<br>\r\n";
    $file = fopen("test.txt", "w");
    var_dump($file);// Output=> resource(3, stream)

    // resource类型为4的文件夹类型
    echo "<br>\r\n";
    $dir = opendir("./test");
    var_dump($dir);// Output=> resource(4, stream)

    // ！！！返回的是对象类型 object(mysqli)[2]
    echo "<br>\r\n";
    $mysqlLink = mysqli_connect("localhost", "root", "root");
    var_dump($mysqlLink);// Output=> object(mysqli)[2]

    // resource类型为6的图像类型
    echo "<br>\r\n";
    $imageHandle = imagecreate(100, 100);
    var_dump($imageHandle);// Output=> resource(6, gd)

    // resource类型为7的xml解析器类型
    echo "<br>\r\n";
    $xmpParser= xml_parser_create();
    var_dump($xmpParser);// Output=> resource(7, xml)
}

// NULL 类型
{
    echo "<br>\r\n<br>\r\n";
    $a = NULL;
    $b = "123";
    unset($b);
    var_dump($a);
    var_dump($b);
}

// 变量的类型转换
{
    echo "<br>\r\n<br>\r\n";
    // 使用xxxval方法处理类型转换
    $str = "123.45abc";
    $int = intval($str);
    $float = floatval($str);
    $str = strval(123.456);

//    echo "int = " . $int . "\r\n ";
//    echo "float = " . $float . "\r\n ";
//    echo "str = " . $str . "\r\n ";

    var_dump($str);
    var_dump($int);
    var_dump($float);

    // 使用settype方法处理类型转换
    $stringValue = "5bar";
    settype($stringValue, "integer");
    var_dump($stringValue);

    $bool = true;
    settype($bool, "string");
    var_dump($bool);

    {
        $img = imagecreate(100, 100);
        settype($img, "string");
        var_dump($img);//'Resource id #8'
    }
    {
        $img = imagecreate(100, 100);
        settype($img, "float");
        var_dump($img);//float 9
    }
    {
        $img = imagecreate(100, 100);
        settype($img, "integer");
        var_dump($img);//int 10
    }

    {
        $img = imagecreate(100, 100);
        settype($img, "bool");
        var_dump($img);//boolean true
    }

    // is_xxx类型判断函数
    // 标量判断
    is_bool($bool);
    is_int($bool);
    is_float($bool);
    is_string($bool);

    // 复合类型判断
    is_array($bool);
    is_object($bool);

    // 标量判断
    is_scalar($bool);
    // NULL 类型判断
    is_null($bool);
    // 资源类型判断
    is_resource($bool);
    // 数值类型判断
    is_numeric($bool);
    // 判断是否是有效的函数名
    is_callable($bool);
}